/**
 * 文件级注释：
 * 组织服务前端封装，统一处理商户相关接口调用。
 * 所有接口以返回值 code === 0 作为成功。
 */
import http from '../api/http'
import type { ApiResult, PageResult, EpaylinksPaper, EpaylinksBusinessInfo } from './types'

// 商户响应类型（与后端 MerchantResponseDto 对齐，字段尽量可选以兼容）
export interface MerchantResponse {
  id?: string
  merchantCode?: string
  name?: string
  merchantType?: number
  address?: string
  detailedAddress?: string
  contactPerson?: string
  contactPhone?: string
  creationTime?: string
  enableStatus?: number
  settlementCycle?: number
  accountStatus?: number
  auditStatus?: number
  location?: string
  // 进件信息（部分接口使用）
  merchantName?: string
  acqSpId?: string
  acqMerId?: string
  merId?: string
  /** 证件材料（反序列化后的结构） */
  paper?: EpaylinksPaper
  acceptOrder?: number
  auditMsg?: string
  auditTime?: string
  /** 业务开通信息列表 */
  business?: EpaylinksBusinessInfo[]
}

// 商户注册/编辑请求体（与后端 MerchantRequestDto 主要字段对齐）
// PC端不提供注册商户，移除注册相关请求类型

/**
 * 类级注释：
 * OrganizationService 封装商户相关接口调用，包括列表、详情、进件详情等。
 */
export class OrganizationService {
  // 获取商户列表（分页）
  static async getMerchantList(page: number = 1, limit: number = 10, key: string = ''): Promise<ApiResult<PageResult<MerchantResponse>>> {
    const resp = await http.get<ApiResult<PageResult<MerchantResponse>>>('/Organization/GetMerchantList', { params: { page, limit, key } })
    // 后端返回形如 { code, message, data: { data: Merchant[], total } }
    return resp.data
  }

  // 获取单个商户详情
  static async getMerchantDetail(id: string): Promise<ApiResult<MerchantResponse>> {
    const resp = await http.get<ApiResult<MerchantResponse>>('/Organization/GetMerchantDetail', { params: { id } })
    return resp.data
  }

  /**
   * 获取单个商户进件信息详情
   * @param id 商户ID
   * @returns ApiResult<MerchantResponse> 返回进件详情数据（含 paper/business 等）
   * @throws 可能抛出网络或服务端异常（axios 错误）
   */
  static async getMerchantEntryDetail(id: string): Promise<ApiResult<MerchantResponse>> {
    const resp = await http.get<ApiResult<MerchantResponse>>('/Organization/GetMerchantEntryDetail', { params: { id } })
    return resp.data
  }

  // PC端不提供注册商户功能，移除注册接口

  // 获取当前用户的商户列表（创建者或关联角色）
  static async getUserMerchantList(): Promise<ApiResult<MerchantResponse[]>> {
    const resp = await http.get<ApiResult<MerchantResponse[]>>('/Organization/GetUserMerchantList')
    return resp.data
  }

  /**
   * 函数级注释：获取当前登录用户的关联角色商户列表
   * @returns ApiResult<any[]> 返回用户关联的角色记录数组（后端 `GetUserRoleMerchantList` 返回的 DTO 集合）
   * @throws 可能抛出网络或服务端异常
   * 说明：以返回值 `code === 0` 判定成功；接口路径为 `/Organization/GetUserRoleMerchantList`（HTTP GET）。
   */
  static async getUserRoleMerchantList(): Promise<ApiResult<any[]>> {
    const resp = await http.get<ApiResult<any[]>>('/Organization/GetUserRoleMerchantList')
    return resp.data
  }

  /**
   * 类级注释：用户角色响应类型（与后端 UserRoleRequestDto 对齐的子集）
   */
  static async getTeamMembersList(page: number = 1, limit: number = 20, key: string = '', merchantId: string = '', storeId: string = '', roleType: number = -1): Promise<ApiResult<PageResult<any>>> {
    /**
     * 函数级注释：获取团队成员列表（去重后每个用户一条）
     * @param page 页码，默认 1
     * @param limit 每页条数，默认 20
     * @param key 成员昵称（支持模糊查询）
     * @param merchantId 商户ID（可选）
     * @param storeId 门店ID（可选）
     * @param roleType 角色类型（-1 表示不限）
     * @returns ApiResult<PageResult<any>> 返回 { data: { data: 列表, total } }
     * @throws 可能抛出网络请求异常
     */
    const params: any = { page, limit, key }
    if (merchantId) params.merchantId = merchantId
    if (storeId) params.storeId = storeId
    if (roleType !== -1) params.roleType = roleType
    const resp = await http.get<ApiResult<PageResult<any>>>('/Organization/GetTeamMembersList', { params })
    return resp.data
  }

  /**
   * 函数级注释：为指定用户分配角色
   * @param data 请求体参数
   *  - UserId：用户ID（必填）
   *  - RoleType：角色类型（必填，0=成员，1=管理员，2=店员）
   *  - MerchantId：商户ID（可选，若角色与商户关联）
   *  - StoreId：门店ID（可选，若角色与门店关联）
   * @returns ApiResult<boolean> 返回操作是否成功（仅当返回值 code === 0 视为成功）
   * @throws 可能抛出网络或服务端异常
   */
  static async assignUserRole(data: {
    /** 用户ID */ UserId: string
    /** 角色类型（0成员，1管理员，2店员） */ RoleType: number
    /** 商户ID（可选） */ MerchantId?: string
    /** 门店ID（可选） */ StoreId?: string
  }): Promise<ApiResult<boolean>> {
    // 说明：后端具体接口路径需与服务保持一致，若后端为 AddTeamMember/AssignRole，请调整此路径。
    const resp = await http.post<ApiResult<boolean>>('/Organization/AddUserRole', data)
    return resp.data
  }

  /**
   * 函数级注释：获取系统角色列表（支持按组织类型过滤）
   * @param dto 请求体
   *  - RoleName：角色名（可选，模糊查询）
   *  - OrgTypeList：组织类型集合（可选，0=平台，1=商户，2=门店）
   * @returns ApiResult<RoleItem[]> 返回角色数组
   * @throws 可能抛出网络或服务端异常
   */
  static async getRoleList(dto: { RoleName?: string; OrgTypeList?: number[] }): Promise<ApiResult<RoleItem[]>> {
    const resp = await http.post<ApiResult<RoleItem[]>>('/Organization/GetRoleList', dto)
    return resp.data
  }

  /**
   * 函数级注释：新增团队成员（通过手机号为用户分配角色）
   * @param dto 请求体
   *  - `Phone`：用户手机号（必填）
   *  - `RoleId`：角色ID（必填）
   *  - `Name`：成员昵称（可选）
   *  - `MerchantId`：商户ID（角色为商户/门店时必填）
   *  - `StoreId`：门店ID（角色为门店时必填）
   *  - `CodeId`：收款码ID（可选，对应后端接口文档）
   * @returns ApiResult<boolean> 返回是否成功（以 `code === 0` 判定）
   * @throws 可能抛出网络或服务端异常
   */
  static async addTeamMembers(dto: { Phone: string; RoleId: string; Name?: string; MerchantId?: string; StoreId?: string; CodeId?: string }): Promise<ApiResult<boolean>> {
    const resp = await http.post<ApiResult<boolean>>('/Organization/AddTeamMembers', dto)
    return resp.data
  }
}

/**
 * 类级注释：角色列表项类型（与后端 RoleRequestDto 响应子集对齐）
 */
export interface RoleItem {
  /** 角色ID */ Id?: string
  /** 角色名称 */ RoleName?: string
  /** 角色类型 */ RoleType?: number
  /** 组织类型（0平台，1商户，2门店） */ OrganizationType?: number
  /** 描述 */ Description?: string
  /** 创建时间 */ CreationTime?: string
}

